package com.qf.dao.impl;

import com.qf.dao.OrderDao;
import com.qf.pojo.Order;
import com.qf.pojo.OrderItem;
import com.qf.pojo.Product;
import com.qf.pojo.User;
import com.qf.utils.DruidJdbcUtils;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.*;

import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 * @author 高圆圆
 * @date 2023/4/25 14:17
 * 订单数据访问接口实现
 */
public class OrderDaoImpl  implements OrderDao {
    /**
     * 插入订单
     * @param order 订单实体
     */
    @Override
    public void insertOrder(Order order) throws SQLException {

        //自动提交

       /* //执行对象
        QueryRunner qr = new QueryRunner(DruidJdbcUtils.getDataSource()) ;
        //sql
        String sql = "insert into orders values(?,?,?,?,?,?,?,?)" ;
        int count = qr.update(sql,
                order.getOid(),
                order.getOrdertime(),
                order.getTotal(),
                order.getState(),
                order.getAddress(),
                order.getUser().getName(),
                order.getTelephone(),
                order.getUser().getUid());*/
        //Commons-dbutils使用这个工具---自动提交---需要执行对象QueryRunner无参构造方法
        QueryRunner qr = new QueryRunner() ;
        String sql = "insert into orders values(?,?,?,?,?,?,?,?)" ;
        //添加/删除/修改 ----update(Connection conn,String sql,Object[] params...)
        int count = qr.update(
                DruidJdbcUtils.getConnection(),
                sql, order.getOid(),
                order.getOrdertime(),
                order.getTotal(),
                order.getState(),
                order.getAddress(),
                order.getUser().getName(),
                order.getTelephone(),
                order.getUser().getUid());

    }

    /**
     * 插入订单项实体
     * @param orderItem 订单项实体
     */
    @Override
    public void insertOrderItem(OrderItem orderItem) throws SQLException {
       /* //执行对象
        QueryRunner qr = new QueryRunner(DruidJdbcUtils.getDataSource()) ;
        //sql
        String sql = "insert into orderitem values(?,?,?,?,?)" ;
        int count = qr.update(sql,
                orderItem.getItemid(),
                orderItem.getCount(),
                orderItem.getSubtotal(),
                orderItem.getProduct().getPid(),
                orderItem.getOrder().getOid());*/

        QueryRunner qr = new QueryRunner() ;
        String sql = "insert into orderitem values(?,?,?,?,?)" ;
        int count = qr.update(
                DruidJdbcUtils.getConnection(),
                sql,
                orderItem.getItemid(),
                orderItem.getCount(),
                orderItem.getSubtotal(),
                orderItem.getProduct().getPid(),
                orderItem.getOrder().getOid());


    }

    /**
     * 数据访问接口获取订单分页数据
     * @param currentPage 当前页码
     * @param pageSize    每页显示的条数
     * @param user      用户实体
     * @return 返回分页数据
     */
    @Override
    public List<Order> findOrderByPage(int currentPage, int pageSize, User user) throws SQLException, InvocationTargetException, IllegalAccessException {
        //创建执行对象
        QueryRunner qr = new QueryRunner(DruidJdbcUtils.getDataSource()) ;
        //sql
        String sql = "select * from orders where uid = ? order by ordertime desc limit ?,?" ;
        //获取用户所属的订单有哪些
        List<Order> orders = qr.query(sql, new BeanListHandler<>(Order.class),
                user.getUid(), (currentPage - 1) * pageSize, pageSize) ;
        //这个用户的订单列表,遍历所有订单
        //在查询--->订单项的数据以及订单中所属商品的信息,
        sql = "SELECT * FROM orderitem oi ,product p WHERE  oi.`pid` = p.`pid` AND oi.`oid`  = ? ;";
        for(Order order:orders){

            //查询上面的sql,获取到所有的订单项和商品数据,完成封装
            List<Map<String, Object>> maps = qr.query(sql, new MapListHandler(), order.getOid());
            //Map--->Key:就是商品和订单项的属性名---Value:获取到的内容
            for(Map<String, Object> map:maps ){
                //封装Product
                Product product = new Product() ;
                BeanUtils.populate(product,map) ;
                //封装订单项数据
                OrderItem oi = new OrderItem() ;
                BeanUtils.populate(oi,map) ;
                //将商品的数据封装订单项中
                oi.setProduct(product) ;

                //获取订单中包含的订单项的集合列表
                List<OrderItem> list = order.getList();
                list.add(oi) ;
            }
        }
        return orders;
    }

    /**
     * 查询用户下订单的总记录数
     * @param user 订单实体
     * @return 返回的总记录数
     */
    @Override
    public int getTotalCount(User user) throws SQLException {
        //执行对象
        QueryRunner qr = new QueryRunner(DruidJdbcUtils.getDataSource()) ;
        //sql
        String sql = "select count(oid) from orders where uid = ?" ;
        //查询
        Object obj = qr.query(sql, new ScalarHandler<>(), user.getUid());
        int totalCount = Integer.parseInt(String.valueOf(obj)) ;
        return totalCount;
    }

    /**
     * 订单数据访问接口获取订单实体,通过订单编号
     * @param oid 订单编号
     * @return 返回指定的订单
     */
    @Override
    public Order selectOrderByOid(String oid) throws SQLException {
        //执行对象
        QueryRunner qr = new QueryRunner(DruidJdbcUtils.getDataSource()) ;
        //sql
        String sql = "select * from orders where oid = ?" ;
        Order order = qr.query(sql, new BeanHandler<>(Order.class), oid);
        return order;
    }

    /**
     * 订单数据访问接口更新订单状态
     * @param order 订单实体
     */
    @Override
    public void updateOrder(Order order) throws SQLException {
        //创建执行对象
        QueryRunner qr = new QueryRunner(DruidJdbcUtils.getDataSource()) ;

        //sql
        String sql = "update orders set state = ? where oid = ?" ;
        //更新
        qr.update(sql,order.getState(),order.getOid()) ;

    }
}
